package 蚂蚁课堂;

import java.util.concurrent.*;

/**
 * CyclicBarrier：就像生活中我们会约朋友们到某个餐厅一起吃饭，有些朋友可能会早到，
 *                  有些朋友可能会晚到，但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。
 *                  这里的朋友们就是各个线程，餐厅就是 CyclicBarrier
 *   CyclicBarrier:就是等待所有的线程都执行完成之后，才能共同继续向下执行
 */
public class CyclicBarrierDemo {

    public static void main(String[] args) throws BrokenBarrierException, InterruptedException, TimeoutException {

        /**
         * 创建一个计数器，初始个数是3
         */
        final CyclicBarrier cyclicBarrier=new CyclicBarrier(3);

        new Thread(new Runnable() {
            public void run() {
                System.out.println("t1  start..................");
                try {
                    TimeUnit.SECONDS.sleep(10);
                    /**
                     * 等待
                     */
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("t1  end ....................");

            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                System.out.println("t2  start..................");
                try {
                    /**
                     * 等待
                     */
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("t2  end ....................");

            }
        }).start();

        /**
         * 等待
         */
        cyclicBarrier.await();
        System.out.println("main.....................");
    }
}
